package com.itjin.health.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itjin.health.domain.dto.AppointmentCancelRequest;
import com.itjin.health.domain.dto.OfflineAssessmentRequest;
import com.itjin.health.domain.dto.OnlineAssessmentRequest;
import com.itjin.health.domain.dto.OnlineAssessmentDetailRequest;
import com.itjin.health.domain.entity.OfflineAssessmentAppointment;
import com.itjin.health.domain.entity.OnlineAssessmentAppointment;
import com.itjin.health.domain.vo.OfflineAppointmentDetailVO;
import com.itjin.health.domain.vo.OnlineAppointmentDetailVO;

/**
 * 评估服务接口
 */
public interface AssessmentService {

    /**
     * 申请线下评估
     *
     * @param request 线下评估请求
     * @return 预约ID
     */
    Integer applyOfflineAssessment(OfflineAssessmentRequest request);

    /**
     * 取消线下评估预约
     *
     * @param request 取消预约请求
     * @return 是否成功
     */
    boolean cancelOfflineAppointment(AppointmentCancelRequest request);

    /**
     * 获取学生的预约列表
     *
     * @param studentId 学生ID
     * @param status    状态（可选，默认全部）
     * @param current   当前页
     * @param size      每页大小
     * @return 预约分页列表
     */
    Page<OfflineAssessmentAppointment> listStudentAppointments(Integer studentId, String status, long current,
            long size);

    /**
     * 获取预约详情
     *
     * @param appointmentId 预约ID
     * @return 预约详情
     */
    OfflineAssessmentAppointment getAppointmentById(Integer appointmentId);

    /**
     * 申请线上评估（详细版）
     *
     * @param request 线上评估详细请求
     * @return 预约ID
     */
    Integer applyOnlineAssessmentDetail(OnlineAssessmentDetailRequest request);

    /**
     * 取消线上评估预约
     *
     * @param request 取消预约请求
     * @return 是否成功
     */
    boolean cancelOnlineAppointment(AppointmentCancelRequest request);

    /**
     * 获取学生的线上预约列表
     *
     * @param studentId 学生ID
     * @param status    状态（可选，默认全部）
     * @param current   当前页
     * @param size      每页大小
     * @return 预约分页列表
     */
    Page<OnlineAssessmentAppointment> listStudentOnlineAppointments(Integer studentId, String status, long current,
            long size);

    /**
     * 获取线上预约详情
     *
     * @param appointmentId 预约ID
     * @return 预约详情
     */
    OnlineAssessmentAppointment getOnlineAppointmentById(Integer appointmentId);

    // ==================== 以下是管理员/教师使用的方法 ====================

    /**
     * 获取管理员/教师的线下评估预约列表
     *
     * @param teacherId 教师ID
     * @param status    状态（可选，默认"待审核"）
     * @param current   当前页
     * @param size      每页大小
     * @return 预约分页列表 (包含学生和伤病报告的详细信息)
     */
    Page<OfflineAppointmentDetailVO> getTeacherOfflineAppointments(Integer teacherId, String status, long current,
            long size);

    /**
     * 审核线下评估预约
     *
     * @param appointmentId 预约ID
     * @param teacherId     教师ID
     * @param approved      是否通过
     * @param rejectReason  拒绝原因（拒绝时必填）
     * @param teacherNote   教师备注（可选）
     * @return 审核结果
     */
    boolean reviewOfflineAppointment(Integer appointmentId, Integer teacherId, Boolean approved, String rejectReason,
            String teacherNote);

    /**
     * 完成线下评估并提交反馈
     *
     * @param appointmentId 预约ID
     * @param teacherId     教师ID
     * @param feedback      教师反馈
     * @return 完成结果
     */
    boolean completeOfflineAppointment(Integer appointmentId, Integer teacherId, String feedback);

    /**
     * 获取管理员/教师的线上评估预约列表
     *
     * @param teacherId 教师ID
     * @param status    状态（可选，默认"待审核"）
     * @param current   当前页
     * @param size      每页大小
     * @return 预约分页列表 (包含学生和伤病报告的详细信息)
     */
    Page<OnlineAppointmentDetailVO> getTeacherOnlineAppointments(Integer teacherId, String status, long current,
            long size);

    /**
     * 审核线上评估预约
     *
     * @param appointmentId   预约ID
     * @param teacherId       教师ID
     * @param approved        是否通过
     * @param meetingUrl      会议链接（通过时必填）
     * @param meetingId       会议ID（通过时必填）
     * @param meetingPassword 会议密码（通过时必填）
     * @param rejectReason    拒绝原因（拒绝时必填）
     * @return 审核结果
     */
    boolean reviewOnlineAppointment(Integer appointmentId, Integer teacherId, Boolean approved,
            String meetingUrl, String meetingId, String meetingPassword, String rejectReason);

    /**
     * 完成线上评估并提交反馈
     *
     * @param appointmentId 预约ID
     * @param teacherId     教师ID
     * @param feedback      教师反馈
     * @return 完成结果
     */
    boolean completeOnlineAppointment(Integer appointmentId, Integer teacherId, String feedback);

    /**
     * 获取评估统计数据
     *
     * @param startDate 开始日期（可选）
     * @param endDate   结束日期（可选）
     * @return 统计数据
     */
    Object getAssessmentStats(String startDate, String endDate);
}